﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO.IsolatedStorage;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Controls.Primitives;
using System.Windows.Input;
using WP8_Client.CustomObjects;
using WP8_Client.Model;
using WP8_Client.View;


namespace WP8_Client.ViewModels
{
    public class DefaultViewModel
    {
        ClientCore cClientCore;
        Popup cPopUp_LogIn;
        LocationController cLocationController;

        public CurrentUser CurrentUser { get; set; }
        public ObservableCollection<Session> Sessions { get; set; }

        public delegate void LocationEventHandler(Location pLocation);
        public event LocationEventHandler OnUpdateLocation;
        
        public DefaultViewModel()
        {
            this.cClientCore = new ClientCore();
            this.cLocationController = new LocationController();
            this.cLocationController.OnUpdateLocation += cLocationController_OnUpdateLocation;
            this.cClientCore.OnLogedIn_Confirmation += cClientCore_OnLogedIn_Confirmation;
            CurrentUser = new CurrentUser();
        }

        void cLocationController_OnUpdateLocation(Location pLocation)
        {
            this.cClientCore.UpdateLocation(pLocation);
            if (this.OnUpdateLocation != null)
                this.OnUpdateLocation(pLocation);
        }

        void cClientCore_OnLogedIn_Confirmation()
        {
            this.cLocationController.Start();
        }

        public Boolean LoadSessions()
        {
            if (IsolatedStorageSettings.ApplicationSettings.Count > 0 && IsolatedStorageSettings.ApplicationSettings.Contains(Globals.General.SessionStorageKey))
            {
                this.Sessions = (ObservableCollection<Session>)IsolatedStorageSettings.ApplicationSettings[Globals.General.SessionStorageKey];
                return true;            
            }

            return false;
        }
        public void SaveSessions()
        {
            if (IsolatedStorageSettings.ApplicationSettings.Contains(Globals.General.SessionStorageKey))
            {
                IsolatedStorageSettings.ApplicationSettings[Globals.General.SessionStorageKey] = this.Sessions;
            }
            else
            {
                IsolatedStorageSettings.ApplicationSettings.Add(Globals.General.SessionStorageKey, this.Sessions);
            }
        }

        public void LogIn()
        {
            if (this.CurrentUser.UserName != "")
            {
                if (this.CurrentUser.Password != "")
                {
                    if (this.cClientCore != null)
                    {
                        this.cClientCore.LogIn(this.CurrentUser.UserName, this.CurrentUser.Password);
                    }
                    // Inform User => fuck ... no core available
                }
                // Inform User => Password invalid or empty
            }
            // Inform User => UserName invalid or empty
        }

        public void RegisterNewUser()
        {
            if (this.CurrentUser.UserName != "")
            {
                if (this.CurrentUser.Password != "")
                {
                    if (this.cClientCore != null)
                    {
                        this.cClientCore.RegisterNewUser(this.CurrentUser.UserName, this.CurrentUser.Password);
                    }
                    // Inform User => fuck ... no core available
                }
                // Inform User => Password invalid or empty
            }
            // Inform User => UserName invalid or empty
        }

        public void AddContact()
        {
            this.cClientCore.AddContact();
        }

        #region AppTrigger
        // Code, der beim Starten der Anwendung ausgeführt werden soll (z. B. über "Start")
        // Dieser Code wird beim Reaktivieren der Anwendung nicht ausgeführt
        public void Application_Launching()
        {
            this.CurrentUser = new CurrentUser();   

            this.cPopUp_LogIn = new Popup();
            this.cPopUp_LogIn.Child = new SplashScreenControl(this.cClientCore);
            this.cPopUp_LogIn.IsOpen = true;

            if (!this.LoadSessions())
            {
                this.Sessions = new ObservableCollection<Session>();
            }
        }

        
        // Code, der ausgeführt werden soll, wenn die Anwendung aktiviert wird (in den Vordergrund gebracht wird)
        // Dieser Code wird beim ersten Starten der Anwendung nicht ausgeführt
        public void Application_Activated()
        {

        }
        
        // Code, der ausgeführt werden soll, wenn die Anwendung deaktiviert wird (in den Hintergrund gebracht wird)
        // Dieser Code wird beim Schließen der Anwendung nicht ausgeführt
        public void Application_Deactivated()
        {

        }
        
        // Code, der beim Schließen der Anwendung ausgeführt wird (z. B. wenn der Benutzer auf "Zurück" klickt)
        // Dieser Code wird beim Deaktivieren der Anwendung nicht ausgeführt
        public void Application_Closing()
        {
            this.SaveSessions();
            this.cClientCore.Close();   //Close socket                    
        }
        #endregion 
    }
}
